#include <EEPROM.h>
#include <UTFT.h> //библиотека дисплея
#include <ITDB02_Touch.h> //библиотека тачскирина
#include <avr/pgmspace.h> //надо для подгрузки картинок
#include <display.ino>
#include <touch.ino>
#include <termo.ino>
#include <buttons.ino>
// 0 порядковый номер, 
// 1 обнаружен ли датчик, 
// 2 идет ли смена температуры, 
// 3 необходимая температура, 
// 4 текущая температура, 
// 5 последняя температуа 
// 6 допустимое отклонение
// 7 pin для отображения перегрева
// 8 pin для отображения переохлаждения
int elements[7][9] = {
  {0,0,0,  0, 0, 0, 0,  40, 41}, 
  {0,0,0,  0, 0, 0, 0,  42, 43},
  {0,0,0,  0, 0, 0, 0,  24, 45},
  {0,0,0,  0, 0, 0, 0,  46, 47},
  {0,0,0,  0, 0, 0, 0,  48, 49},
  {0,0,0,  0, 0, 0, 0,  50, 51},
  {0,0,0,  0, 0, 0, 0,  52, 53}
};
int height;  //высота экрана
int width;   //ширина экрана
int interval = 27; //интевал между строками
int p = 40; //размер квадратика управления
boolean redraw = true; //необходимость перерисовать все
boolean setDelta = false; //устанавливаем не температуру а дельту
int tmp1,tmp2,tmpTime; //сервисные
int selected = 1; //текущий выбранный элемент
int vertPos; //вертикальная позиция для отрисовки текущего элемента
boolean initMode = true; //режим инициализации
unsigned long time;

void setup()
{
  /*for (int i = 0; i < 4000; ++i)
  {
    EEPROM.write(i,0);
  }*/
  displayInit();
  touchInit();
  //Serial.begin(9600);
  Serial.println("Start");
  setupButtons(); //инициализация кнопок
  readData();
  showLogo();
  checkDevice(true); //инициализация датчиков
  initDevices();
}
void initDevices(){
  vertPos = 40;
  for(int i=0; i<7; i++) {
    showInitMesage(i, elements[i][1]);
    pinMode(elements[i][7],OUTPUT);
    pinMode(elements[i][8],OUTPUT);
  }
  delay(1000);
  showButtons(); //отрисовка кнопок
}

//======================== чтение зарание сохраненнх значений ============================
void readData(){
  for(int i=0; i<7; i++) {
    elements[i][3] = EEPROM.read(i*100)*100 + EEPROM.read(i*100+1);
    elements[i][6] = EEPROM.read(i*100+10)*100 + EEPROM.read(i*100+11);
  }
}

void writeData(int num, int type, int value){
  tmp1 = value/100;
  tmp2 = value - tmp1*100;
  EEPROM.write(num*100 + type*10, tmp1);
  EEPROM.write(num*100 + type*10 + 1, tmp2);
}
//======================== проверка датчиков ============================
void checkDevice(boolean first){
  tmp1=1;
  for(int i=0; i<7; i++) {
    tmp2 = elements[i][0];
    //проверяем датчик
    if(getTemperature(i,true)){
      
      if(first || !elements[i][1]){
        pinMode(elements[i][7],OUTPUT); //для отображения перегрева
        pinMode(elements[i][8],OUTPUT); //для отображения переохлаждения
      }
      elements[i][1] = 1; //датчик включен
      elements[i][0] = tmp1;
      tmp1++;
    } else {
      elements[i][0] = 0;
      if(elements[i][1]) {
        redraw = true;
        action(i,0);
      }
      elements[i][1] = 0;
    }
    if(tmp2 != elements[i][0]) redraw = true;
  }
}

//======================== рабочая процедура запускаемая переодически ============================
void work(){
  Serial.println("------------");
  checkDevice(false);
  for(int i=0; i<7; i++) {
    if(!elements[i][1]) continue;
    if(elements[i][5] != elements[i][4]){ //если текущее и прошлое значения не равны
      elements[i][5] = elements[i][4]; // записываем текущее как прошлое
      redraw = true;
    }
    if(!elements[i][3]){ 
      elements[i][3] = elements[i][5];
      writeData(i, 0, elements[i][5]);
    }
    if(elements[i][1]){ 
      float currentTemp = getTemperature(i, false);
      if(currentTemp > 200) elements[i][4] = elements[i][5]; //ошибка в показаниях температуры
      else {
        tmp1 = currentTemp*10;
        elements[i][4] = tmp1*10;
        //elements[i][4] = currentTemp*100; //снимаем показания температуры
      }
    }
    setAction(i);
  }
}

//======================== основной цикл ============================
void loop()
{
  tmpTime = millis()/3000; //запускаем рабочую функцию каждые 3 секунды
  if(tmpTime > time){
    time = tmpTime;
    work();
  }
  touchTest();
  actionButtons();
  vertPos = 10;
  if(redraw){
    buildHuman();
    boolean found = false;
    for(int i=0; i<7; i++) {
      if(elements[i][1]) found = true;
      buildEl(i);
    }
    clearTexts();
    redraw = false;
  }
}